//
// Created by LiuYou on 2021/5/21.
//

// TODO 注意:
/** @file bits/hashtable.h
 *  This is an internal header file, included by other library headers.
 *  Do not attempt to use it directly. @headername{unordered_map, unordered_set}
 */
// 不要直接使用 bits/hashtable.h 头文件。如果想使用可以导入 unordered_map或者unordered_set的头文件。




#include <cstdlib>
#include <unordered_map>
#include <iostream>

int main() {
    // 创建一个hashtable。
    // TODO 注意: 这里为什么没有创建_Hashtable, 原因是它的模板参数实在是太多了！！！！而且我也不懂。
    //  通过阅读源代码得知__ummap_hashtable是对_Hashtable的using别名。它的参数模板更容易使用和利于理解。
    //  这里要注意: 把源代码搬过来理解
    //  __umap_hashtable是unordered_map的底层支持; __ummap_hashtable是unordered_multimap的底层支持！！！！

//    /// Base types for unordered_map.
//    template<bool _Cache>
//    using __umap_traits = __detail::_Hashtable_traits<_Cache, false, true>;
//
//    template<typename _Key,
//            typename _Tp,
//            typename _Hash = hash<_Key>,
//            typename _Pred = std::equal_to<_Key>,
//            typename _Alloc = std::allocator<std::pair<const _Key, _Tp> >,
//            typename _Tr = __umap_traits<__cache_default<_Key, _Hash>::value>>
//    using __umap_hashtable = _Hashtable<_Key, std::pair<const _Key, _Tp>,
//            _Alloc, __detail::_Select1st,
//            _Pred, _Hash,
//            __detail::_Mod_range_hashing,
//            __detail::_Default_ranged_hash,
//            __detail::_Prime_rehash_policy, _Tr>;
//
//    /// Base types for unordered_multimap.
//    template<bool _Cache>
//    using __ummap_traits = __detail::_Hashtable_traits<_Cache, false, false>;
//
//    template<typename _Key,
//            typename _Tp,
//            typename _Hash = hash<_Key>,
//            typename _Pred = std::equal_to<_Key>,
//            typename _Alloc = std::allocator<std::pair<const _Key, _Tp> >,
//            typename _Tr = __ummap_traits<__cache_default<_Key, _Hash>::value>>
//    using __ummap_hashtable = _Hashtable<_Key, std::pair<const _Key, _Tp>,
//            _Alloc, __detail::_Select1st,
//            _Pred, _Hash,
//            __detail::_Mod_range_hashing,
//            __detail::_Default_ranged_hash,
//            __detail::_Prime_rehash_policy, _Tr>;

    std::__umap_hashtable<int, int> hashtable;
    hashtable.insert({5, 5});
    for (const auto& item : hashtable) {
        std::cout << item.first << " " << item.second << " " << std::endl;
    }
    hashtable.insert({5, 5});
    for (const auto& item : hashtable) {
        std::cout << item.first << " " << item.second << " " << std::endl;
    }


    std::exit(0);
}